/**
 * 任务包上传和创建功能
 * 提供文件上传、任务包创建和进度监控的功能
 */
$(function() {
    /**
     * 初始化文件上传和任务包创建功能
     * @param {Object} options 配置选项
     */
    window.initTaskPackageUpload = function(options = {}) {
        // 默认配置
        const defaultOptions = {
            formSelector: '#taskPackageForm',       // 表单选择器
            fileInputSelector: '#fileInput',        // 文件输入框选择器
            submitBtnSelector: '#submitBtn',        // 提交按钮选择器
            progressContainerSelector: '#uploadProgressContainer',  // 进度条容器选择器
            progressBarSelector: '#uploadProgressBar',  // 进度条选择器
            progressTextSelector: '#uploadProgressText',  // 进度文本选择器
            errorMsgSelector: '#errorMsg',          // 错误信息选择器
            uploadEndpoint: '/tasking/uploadFileAndCreatePackage', // 上传端点
            autoRedirect: true,                     // 是否自动跳转到进度页面
            onSuccess: null,                        // 成功回调
            onError: null,                          // 错误回调
            onProgress: null                        // 进度回调
        };
        
        // 合并配置
        const settings = $.extend({}, defaultOptions, options);
        
        // 获取DOM元素
        const $form = $(settings.formSelector);
        const $fileInput = $(settings.fileInputSelector);
        const $submitBtn = $(settings.submitBtnSelector);
        const $progressContainer = $(settings.progressContainerSelector);
        const $progressBar = $(settings.progressBarSelector);
        const $progressText = $(settings.progressTextSelector);
        const $errorMsg = $(settings.errorMsgSelector);
        
        // 检查表单是否存在
        if ($form.length === 0) {
            console.error('找不到表单元素：', settings.formSelector);
            return;
        }
        
        // 初始化上传事件
        $form.on('submit', function(e) {
            e.preventDefault();
            
            // 检查文件是否选择
            const files = $fileInput[0].files;
            if (files.length === 0) {
                showError('请选择要上传的文件');
                return false;
            }
            
            // 检查文件类型
            const file = files[0];
            const fileExt = file.name.split('.').pop().toLowerCase();
            if (fileExt !== 'xlsx' && fileExt !== 'xls') {
                showError('只支持上传Excel文件(.xlsx或.xls)');
                return false;
            }
            
            // 检查任务包名称
            const taskPackageName = $('#taskPackageName').val();
            if (!taskPackageName) {
                showError('请输入任务包名称');
                return false;
            }
            
            // 禁用提交按钮
            $submitBtn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> 上传中...');
            
            // 显示进度条
            $progressContainer.show();
            $progressBar.css('width', '0%').attr('aria-valuenow', 0);
            $progressText.text('准备上传...');
            $errorMsg.hide();
            
            // 创建FormData对象
            const formData = new FormData($form[0]);
            
            // 发起Ajax请求
            $.ajax({
                url: settings.uploadEndpoint,
                type: 'POST',
                data: formData,
                processData: false,
                contentType: false,
                xhr: function() {
                    const xhr = new window.XMLHttpRequest();
                    
                    // 添加上传进度事件
                    xhr.upload.addEventListener('progress', function(e) {
                        if (e.lengthComputable) {
                            const percent = Math.round((e.loaded / e.total) * 100);
                            updateProgress(percent, '文件上传中... ' + percent + '%');
                            
                            if (typeof settings.onProgress === 'function') {
                                settings.onProgress(percent, e);
                            }
                        }
                    }, false);
                    
                    return xhr;
                },
                success: function(response) {
                    if (response.code === 200) {
                        // 上传成功
                        updateProgress(100, '上传成功');
                        
                        // 设置跳转信息
                        const data = response.data;
                        const successMsg = '任务包创建成功，ID：' + data.taskPackageId + 
                                         '，名称：' + data.taskPackageName;
                        
                        // 调用成功回调
                        if (typeof settings.onSuccess === 'function') {
                            settings.onSuccess(data);
                        }
                        
                        // 自动跳转到进度页面
                        if (settings.autoRedirect && data.progressUrl) {
                            setTimeout(function() {
                                window.location.href = data.progressUrl;
                            }, 1000);
                        } else {
                            // 显示成功消息
                            showSuccess(successMsg);
                            
                            // 重置表单
                            resetForm();
                        }
                    } else {
                        // 上传失败
                        showError(response.message || '上传失败');
                        resetForm();
                        
                        // 调用错误回调
                        if (typeof settings.onError === 'function') {
                            settings.onError(response);
                        }
                    }
                },
                error: function(xhr, status, error) {
                    // 上传出错
                    showError('请求失败: ' + (xhr.responseJSON?.message || error));
                    resetForm();
                    
                    // 调用错误回调
                    if (typeof settings.onError === 'function') {
                        settings.onError({xhr, status, error});
                    }
                }
            });
            
            return false;
        });
        
        /**
         * 更新进度条
         * @param {Number} percent 百分比
         * @param {String} text 进度文本
         */
        function updateProgress(percent, text) {
            $progressBar.css('width', percent + '%').attr('aria-valuenow', percent);
            $progressText.text(text);
        }
        
        /**
         * 显示错误信息
         * @param {String} message 错误消息
         */
        function showError(message) {
            $errorMsg.html('<div class="alert alert-danger">' + message + '</div>').show();
        }
        
        /**
         * 显示成功信息
         * @param {String} message 成功消息
         */
        function showSuccess(message) {
            $errorMsg.html('<div class="alert alert-success">' + message + '</div>').show();
        }
        
        /**
         * 重置表单
         */
        function resetForm() {
            $submitBtn.prop('disabled', false).html('上传并创建');
        }
        
        // 返回控制接口
        return {
            updateProgress: updateProgress,
            showError: showError,
            showSuccess: showSuccess,
            resetForm: resetForm
        };
    };
}); 